import axios from 'axios'
import type { LogQueryParams } from '../types'

/**
 * Loki日志服务类，提供与Loki API交互的方法
 */
export default class LokiLogService {
  private apiBaseUrl: string

  /**
   * 构造函数
   * @param apiBaseUrl Loki API基础URL，如果未提供则使用默认值
   */
  constructor(apiBaseUrl?: string) {
    // 如果提供了自定义API URL则使用，否则使用默认值
    this.apiBaseUrl = apiBaseUrl || 'http://localhost:3100' // 默认Loki端口
  }

  /**
   * 查询日志
   * @param params 日志查询参数
   */
  async queryLogs(params: LogQueryParams): Promise<string[]> {
    try {
      // 构建Loki查询表达式
      const logQLQuery = this.buildLogQLQuery(params);
      
      // 调用Loki API查询日志
      const response = await axios.get(`${this.apiBaseUrl}/loki/api/v1/query_range`, {
        params: {
          query: logQLQuery,
          start: params.startTime,
          end: params.endTime,
          limit: 1000,
          direction: 'backward'
        }
      });
      return this.processLokiResponse(response.data);
    } catch (error) {
      console.error('查询日志失败:', error);
      throw error;
    }
  }

  /**
   * 构建LogQL查询表达式
   * @param params 日志查询参数
   */
  private buildLogQLQuery(params: LogQueryParams): string {
    // 基础标签选择器
    let query = `{namespace="${params.namespace}", pod="${params.pod}"}`;
    
    // 添加关键词过滤
    if (params.keyword && params.keyword.trim() !== '') {
      query += ` |= "${params.keyword}"`;
    }
    
    return query;
  }

  /**
   * 处理Loki API响应
   */
  private processLokiResponse(responseData: any): string[] {
    const logs: string[] = [];
    
    if (responseData && responseData.data && responseData.data.result) {
      for (const stream of responseData.data.result) {
        for (const [timestamp, value] of stream.values) {
          // 将时间戳转换为可读格式
          // 将纳秒级时间戳转换为毫秒(前10位是秒，后9位是纳秒)
          const seconds = parseInt(timestamp.substring(0, 10));
          const nanos = parseInt(timestamp.substring(10));
          const date = new Date(seconds * 1000 + Math.floor(nanos / 1000000));
          const timeString = date.toLocaleString();
          
          // 格式化日志条目
          logs.push(`[${timeString}] ${value}`);
        }
      }
    }
    
    // 按时间倒序排列，最新的日志在前面
    return logs.reverse();
  }

  /**
   * 设置API基础URL
   * @param url 新的API基础URL
   */
  setApiBaseUrl(url: string): void {
    this.apiBaseUrl = url;
  }

  /**
   * 获取当前API基础URL
   */
  getApiBaseUrl(): string {
    return this.apiBaseUrl;
  }
}